package base;

import java.util.GregorianCalendar;

/**
 * Clase que representa a un cliente genérico de la empresa.
 * @author Efren
 * @version 0.0.1
 * @since 03/02/2013
 */
public class Cliente {
    private String dni;
    private String nombre;
    private String primerApellido;
    private String segundoApellido;
    private Direccion direccion;
    private String email;
    private Telefono[] telefonos;

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getPrimerApellido() {
        return primerApellido;
    }

    public void setPrimerApellido(String primerApellido) {
        this.primerApellido = primerApellido;
    }

    public String getSegundoApellido() {
        return segundoApellido;
    }

    public void setSegundoApellido(String segundoApellido) {
        this.segundoApellido = segundoApellido;
    }

    public Direccion getDireccion() {
        return direccion;
    }

    public void setDireccion(Direccion direccion) {
        this.direccion = direccion;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Telefono[] getTelefonos() {
        return telefonos;
    }

    public void setTelefonos(Telefono[] telefonos) {
        this.telefonos = telefonos;
    }
    /**
     * Método correspondiente a la posible acción de un cliente de enviar una petición. Si la petición sufre un error o no se puede añadir a la lista de peticiones el método devolverá falso.
     * @param descripcion String con la descripción proporcionada por el cliente al realizar la petición.
     * @return verdadero si se ha realizado con éxito y falso en caso contrario.
     */
    public boolean realizarPeticion(String descripcion){
        Peticion peticion = new Peticion();
        if (peticion.getIdPeticion() == -1){
            return false;
        } else {
            peticion.setCliente(this);
            peticion.setFecha(new GregorianCalendar());
            peticion.setDescripcion(descripcion);
            return new ListaPeticiones().addPeticionEntrante(peticion);
        }
    }
    /**
     * Método para rechazar un presupuesto propuesto.
     * @param presupuesto a rechazar.
     */
    public void rechazar(Presupuesto presupuesto){
        presupuesto.denegar();
    }
    /**
     * Método para aceptar un presupuesta. Este método genera una orden de recogida dentro del sistema y el cliente es informado de que ya puede entregar el equipo.
     * @param presupuesto Presupuesto que se desea aceptar.
     * @return Un objeto de RecogidaEquipos que representa la orden de recogida.
     */
    public RecogidaEquipos aceptar(Presupuesto presupuesto){
        presupuesto.aceptar();
        RecogidaEquipos ordenRecogida = new RecogidaEquipos();
        ordenRecogida.setFechaAceptacion(new GregorianCalendar());
        ordenRecogida.setIdPresupuesto(presupuesto.getIdPresupuesto());
        return ordenRecogida;
    }
    /**
     * Método para la entrega de uno o varios equipos por parte del cliente. El equipo es registrado en el almacen y la actividad es generada.
     * @param orden Orden de entrega correspondiente.
     * @param equipos El equipo o equipos que van a ser entregados para su reparación.
     * @return La tarea asociada a la entrega.
     */
    public Tarea entregaEquipo(RecogidaEquipos orden, Equipo[] equipos, int[] empleados){
        orden.entregar();
        Almacen almacen = new Almacen();
        for (Equipo temp : equipos){
            almacen.addEquipo(temp);
        }
        Tarea tarea = new Tarea();
        tarea.setIdTarea(orden.getIdPresupuesto());
        tarea.setIdEmpleado(empleados);
        tarea.setEstado(Estado.PENDIENTE);
        return tarea;
    }
    @Override
    public boolean equals(Object o) {
        Cliente b = (Cliente) o;
        if (b.getDni().equalsIgnoreCase(this.dni)){
            if (b.getNombre().equalsIgnoreCase(this.nombre)){
                if (b.getPrimerApellido().equalsIgnoreCase(this.primerApellido)){
                    if (b.getSegundoApellido().equalsIgnoreCase(this.segundoApellido)){
                        if (b.getEmail().equalsIgnoreCase(this.email)){
                            //Para considerarlos iguales comprobamos que la dirección coincida
                            if (b.direccion.equals(this.direccion)){
                                //Por cada telefono comprobamos que existe en el cliente a comparar
                                for (int i = 0; i < telefonos.length; i++){
                                    //Bandera para la busqueda
                                    boolean encontrado = false;
                                    for (Telefono temp : b.getTelefonos()){
                                        //Si el telefono coincide levantamos la bandera
                                        if(this.telefonos[i].equals(temp)){
                                            encontrado = true;
                                        }
                                    }
                                    //Si durante la ejecución del bucle interno no se ha encontrado un telefono igual ambos objetos son distintos y devolvemos falso
                                    if (!encontrado){
                                        return false;
                                    }
                                }
                                //Si el bucle termina sin producir la salida del programa, los objetos son iguales
                                return true;
                            }
                        }
                    }
                }
            }
        }
        return false;
    }
}
